{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/jfcrenshaw/pzflow/blob/main/examples/intro.ipynb)\n",
    "\n",
    "If running in Colab, to switch to GPU, go to the menu and select Runtime -> Change runtime type -> Hardware accelerator -> GPU.\n",
    "\n",
    "In addition, uncomment and run the following code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# !pip install pzflow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "------------------\n",
    "## Intro to pzflow\n",
    "\n",
    "This notebook demonstrates building a normalizing flow with `pzflow` to learn the joint probability distribution of some 2-D data.\n",
    "\n",
    "You do not need to have any previous knowledge of normalizing flows to get started with `pzflow`, however if you are interested, here are some good sources:\n",
    "- Eric Jang's tutorial: [part 1](https://blog.evjang.com/2018/01/nf1.html), [part 2](https://blog.evjang.com/2018/01/nf2.html)\n",
    "- [Here](https://github.com/janosh/awesome-normalizing-flows)  is a comprehensive list of papers, blogs, videos, and packages\n",
    "- Two good intro papers using Coupling Layers: [NICE](http://arxiv.org/abs/1605.08803), [Real NVP](http://arxiv.org/abs/1605.08803)\n",
    "- The paper on [Neural Spline Couplings](https://arxiv.org/abs/1906.04032)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pzflow import Flow\n",
    "from pzflow.bijectors import RollingSplineCoupling, Chain, Scale\n",
    "from pzflow.examples import two_moons_data\n",
    "\n",
    "import jax.numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First let's load some example data. It's the familiar two moons data set from scikit-learn, loaded in a Pandas DataFrame, which is the data format `pzflow` uses on the user-end."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.026942</td>\n",
       "      <td>1.410649</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.814149</td>\n",
       "      <td>-1.365693</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.718791</td>\n",
       "      <td>0.362482</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.677510</td>\n",
       "      <td>-1.685869</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.060328</td>\n",
       "      <td>-1.363168</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9995</th>\n",
       "      <td>-1.121514</td>\n",
       "      <td>1.657424</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9996</th>\n",
       "      <td>-0.994531</td>\n",
       "      <td>1.445759</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9997</th>\n",
       "      <td>1.170882</td>\n",
       "      <td>-1.276065</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9998</th>\n",
       "      <td>1.061871</td>\n",
       "      <td>-1.318802</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9999</th>\n",
       "      <td>-0.316731</td>\n",
       "      <td>1.340146</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10000 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             x         y\n",
       "0    -1.026942  1.410649\n",
       "1     0.814149 -1.365693\n",
       "2     1.718791  0.362482\n",
       "3     0.677510 -1.685869\n",
       "4     1.060328 -1.363168\n",
       "...        ...       ...\n",
       "9995 -1.121514  1.657424\n",
       "9996 -0.994531  1.445759\n",
       "9997  1.170882 -1.276065\n",
       "9998  1.061871 -1.318802\n",
       "9999 -0.316731  1.340146\n",
       "\n",
       "[10000 rows x 2 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = two_moons_data()\n",
    "data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's plot it to see what it looks like."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist2d(data['x'], data['y'], bins=200)\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's build a normalizing flow.\n",
    "We will use the `Flow` object, which requires two things:\n",
    "1. the names of the columns in our data set\n",
    "2. a bijector\n",
    "\n",
    "The bijector I recommend \"out-of-the-box\" is the Rolling Spline Coupling, a bijector that alternates [Neural Spline Couplings](https://arxiv.org/abs/1906.04032) and \"Rolling\" layers. It has 5 parameters:\n",
    "- `nlayers` - The number of (Neural Spline, Roll()) couplets in the chain of bijectors\n",
    "- `K` - The number of bins in the splines\n",
    "- `B` - The range of the splines\n",
    "- `hidden_layers` - the number of hidden layers in the neural network that calculates the spline bins and derivatives\n",
    "- `hidden_dim` - the number of hidden dimensions in that same neural network\n",
    "\n",
    "Only `nlayers` is required.\n",
    "For this example, we will set `nlayers` = 2 to match the dimension of our data. This ensures that both the $x$ and $y$ dimensions get transformed. Feel free to play around with changing the other parameters. \n",
    "\n",
    "*Note: see the [redshift example](https://github.com/jfcrenshaw/pzflow/blob/main/examples/redshift_example.ipynb) for an example of constructing a more complicated bijector*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# set number of layers in the RollingSplineCoupling\n",
    "# equal to the input dimension\n",
    "nlayers = data.shape[1]\n",
    "\n",
    "# create the bijector\n",
    "bijector = RollingSplineCoupling(nlayers=nlayers)\n",
    "\n",
    "# create the normalizing flow\n",
    "flow = Flow(data.columns, bijector)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can train our normalizing flow.\n",
    "This is as simple as calling `flow.train(data)`.\n",
    "There are several training parameters you can set, including the number of epochs, the batch size, the optimizer, and the random seed.\n",
    "See the documentation for the normalizing flow for more details.\n",
    "For this example, let's use the defaults, but set `verbose=True` so that training losses are printed throughout the training process."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.9297\n",
      "2.6268\n",
      "2.1550\n",
      "1.7683\n",
      "1.5759\n",
      "1.4466\n",
      "1.3693\n",
      "1.3323\n",
      "1.3139\n",
      "1.2914\n",
      "1.2872\n",
      "1.2844\n",
      "1.2546\n",
      "1.2666\n",
      "1.2805\n",
      "1.2362\n",
      "1.2325\n",
      "1.2379\n",
      "1.2185\n",
      "1.2386\n",
      "1.2257\n",
      "1.2470\n",
      "1.2155\n",
      "1.2120\n",
      "1.2293\n",
      "1.2250\n",
      "CPU times: user 2min 31s, sys: 7min 42s, total: 10min 13s\n",
      "Wall time: 31.9 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "losses = flow.train(data, verbose=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's plot the training losses to make sure everything looks like we expect it to..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(losses)\n",
    "plt.xlabel(\"Epoch\")\n",
    "plt.ylabel(\"Training loss\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Perfect!\n",
    "\n",
    "Now we can draw samples from the flow, using the `sample` method.\n",
    "Let's draw 10000 samples and make another histogram to see if it matches the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "samples = flow.sample(10000, seed=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist2d(samples['x'], samples['y'], bins=200, range=((-2,2),(-2,2)))\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Looks great!\n",
    "\n",
    "We can also use the flow to calculate redshift posteriors using the `posterior` method. We need to provide the name of the column we want to calculate a posterior for, as well as a grid on which to calculate the posterior."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "grid = np.arange(-2, 2.02, 0.02)\n",
    "pdfs = flow.posterior(data, column=\"x\", grid=grid)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's plot the first posterior."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(grid, pdfs[0])\n",
    "plt.title(f\"$y$ = {data['y'][0]:.2f}\")\n",
    "plt.xlabel(\"$x$\")\n",
    "plt.ylabel(\"$p(x|y)$\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's store some information with the flow about the data it was trained on."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pzflow\n",
    "flow.info = f\"\"\"\n",
    "This is an example flow, trained on 100,000 points from the scitkit-learn\n",
    "two moons data set.\n",
    "\n",
    "The data set used to train this flow is available in the `examples` module:\n",
    ">>> from pzflow.examples import two_moons_data\n",
    ">>> data = two_moons_data()\n",
    "\n",
    "This flow was created with pzflow version {pzflow.__version__}\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "This is an example flow, trained on 100,000 points from the scitkit-learn\n",
      "two moons data set.\n",
      "\n",
      "The data set used to train this flow is available in the `examples` module:\n",
      ">>> from pzflow.examples import two_moons_data\n",
      ">>> data = two_moons_data()\n",
      "\n",
      "This flow was created with pzflow version 1.3.0\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(flow.info)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's save the flow to a file that can be loaded later:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "flow.save(\"example-flow.pkl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This file can be loaded on Flow instantiation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "flow = Flow(file=\"example-flow.pkl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pzflow",
   "language": "python",
   "name": "pzflow"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
